/**
 * 小程序请求工具封装
 * 提供统一的API请求方法
 */

// API基地址配置 - 方便切换本地和远程
const API_CONFIG = {
  local: 'http://localhost:3129/api',
  remote: 'https://qzhenjewllery.xin/api'
}

// 当前使用的API地址 - 修改这里切换环境
export const BASE_API = API_CONFIG.remote  // 使用本地环境与管理端保持一致

/**
 * 统一的GET请求方法
 * @param {string} url - 请求路径（相对于BASE_API）
 * @param {Object} data - 请求参数
 * @returns {Promise} 请求结果
 */
export const get = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_API + url,
      method: 'GET',
      data,
      header: {
        'Content-Type': 'application/json',
'Authorization': `Bearer ${uni.getStorageSync('mp_token') || ''}`
      },
      success: (res) => {
        if (res.statusCode === 200) {
          if (res.data.success) {
            resolve(res.data)
          } else {
            reject(new Error(res.data.message || '请求失败'))
          }
        } else if (res.statusCode === 400) {
          // 400错误：业务异常，显示具体错误信息
          reject(new Error(res.data.message || '请求失败'))
        } else if (res.statusCode === 401) {
          // 401错误：未授权，需要重新登录
          handleUnauthorized()
          reject(new Error('登录已过期，请重新登录'))
        } else if (res.statusCode === 404) {
          // 404错误：资源不存在
          reject(new Error(res.data.message || '资源不存在'))
        } else {
          reject(new Error(`请求失败，状态码：${res.statusCode}`))
        }
      },
      fail: (err) => {
        console.error('请求失败:', err)
        reject(new Error('网络请求失败'))
      }
    })
  })
}

/**
 * 统一的POST请求方法
 * @param {string} url - 请求路径（相对于BASE_API）
 * @param {Object} data - 请求数据
 * @returns {Promise} 请求结果
 */
export const post = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_API + url,
      method: 'POST',
      data,
      header: {
        'Content-Type': 'application/json',
'Authorization': `Bearer ${uni.getStorageSync('mp_token') || ''}`
      },
      success: (res) => {
        if (res.statusCode === 200) {
          if (res.data.success) {
            resolve(res.data)
          } else {
            reject(new Error(res.data.message || '请求失败'))
          }
        } else if (res.statusCode === 400) {
          // 400错误：业务异常，显示具体错误信息
          reject(new Error(res.data.message || '请求失败'))
        } else if (res.statusCode === 401) {
          // 401错误：未授权，需要重新登录
          handleUnauthorized()
          reject(new Error('登录已过期，请重新登录'))
        } else if (res.statusCode === 404) {
          // 404错误：资源不存在
          reject(new Error(res.data.message || '资源不存在'))
        } else {
          reject(new Error(`请求失败，状态码：${res.statusCode}`))
        }
      },
      fail: (err) => {
        console.error('请求失败:', err)
        reject(new Error('网络请求失败'))
      }
    })
  })
}

/**
 * 统一的PUT请求方法
 * @param {string} url - 请求路径（相对于BASE_API）
 * @param {Object} data - 请求数据
 * @returns {Promise} 请求结果
 */
export const put = (url, data = {}) => {
  return new Promise((resolve, reject) => {
    uni.request({
      url: BASE_API + url,
      method: 'PUT',
      data,
      header: {
        'Content-Type': 'application/json',
'Authorization': `Bearer ${uni.getStorageSync('mp_token') || ''}`
      },
      success: (res) => {
        if (res.statusCode === 200) {
          if (res.data.success) {
            resolve(res.data)
          } else {
            reject(new Error(res.data.message || '请求失败'))
          }
        } else if (res.statusCode === 400) {
          // 400错误：业务异常，显示具体错误信息
          reject(new Error(res.data.message || '请求失败'))
        } else if (res.statusCode === 401) {
          // 401错误：未授权，需要重新登录
          handleUnauthorized()
          reject(new Error('登录已过期，请重新登录'))
        } else if (res.statusCode === 404) {
          // 404错误：资源不存在
          reject(new Error(res.data.message || '资源不存在'))
        } else {
          reject(new Error(`请求失败，状态码：${res.statusCode}`))
        }
      },
      fail: (err) => {
        console.error('请求失败:', err)
        reject(new Error('网络请求失败'))
      }
    })
  })
}

/**
 * 显示加载提示
 * @param {string} title - 提示文字
 */
export const showLoading = (title = '加载中...') => {
  uni.showLoading({
    title,
    mask: true
  })
}

/**
 * 隐藏加载提示
 */
export const hideLoading = () => {
  uni.hideLoading()
}

/**
 * 显示错误提示
 * @param {string} message - 错误信息
 */
export const showError = (message) => {
  uni.showToast({
    title: message,
    icon: 'none',
    duration: 2000
  })
}

/**
 * 显示成功提示
 * @param {string} message - 成功信息
 */
export const showSuccess = (message) => {
  uni.showToast({
    title: message,
    icon: 'success',
    duration: 2000
  })
}

/**
 * 处理401未授权错误
 * 清除本地token并跳转到登录页面
 */
const handleUnauthorized = () => {
  // 获取当前页面路径，用于登录后跳转回来
  const pages = getCurrentPages()
  const currentPage = pages[pages.length - 1]
  const currentRoute = currentPage ? currentPage.route : ''
  const currentOptions = currentPage ? currentPage.options : {}
  
  // 构建完整的页面路径
  let redirectUrl = '/' + currentRoute
  const queryString = Object.keys(currentOptions)
    .map(key => `${key}=${currentOptions[key]}`)
    .join('&')
  if (queryString) {
    redirectUrl += '?' + queryString
  }
  
  // 保存返回地址（排除登录页面本身）
  if (currentRoute !== 'pages/profile/profile') {
    try {
      uni.setStorageSync('mp_redirect_url', redirectUrl)
    } catch (e) {
      console.error('保存返回地址失败:', e)
    }
  }
  
  // 清除登录信息
  try {
    uni.removeStorageSync('mp_token')
    uni.removeStorageSync('mp_user')
  } catch (e) {
    console.error('清除登录信息失败:', e)
  }
  
  // 提示用户并跳转到登录页面
  uni.showToast({
    title: '登录已过期，请重新登录',
    icon: 'none',
    duration: 2000
  })
  
  // 延迟跳转，让用户看到提示
  setTimeout(() => {
    uni.switchTab({
      url: '/pages/profile/profile',
      fail: () => {
        // 如果switchTab失败，尝试navigateTo
        uni.reLaunch({
          url: '/pages/profile/profile'
        })
      }
    })
  }, 1000)
}

// 默认导出
export default {
  get,
  post,
  put,
  showLoading,
  hideLoading,
  showError,
  showSuccess,
  handleUnauthorized,
  BASE_API
}
